import lodash from "lodash";
import {
    fill_cell,
    get_cell_value,
    set_cell_color,
    set_cells,
    set_position_of_para
} from "@/components/js/systemdemo";
import Enum from "@/components/js/enum";

let app = wps.EtApplication();

export function 抽汽2(row) {
    let 高加级数 = JSON.parse(wps.PluginStorage.getItem("高加级数"))
    if (!lodash.includes(高加级数, 2)) { // 如果系统不存在二级高加，则该函数不执行任何操作
        return true
    }
    let sp = Enum.StandardPoint;
    let 加热器顺序 = wps.PluginStorage.getItem("heater_order");
    let data = [
        ["二段抽汽", "二段抽汽压力", "MPa"],
        ["", "二段抽汽温度", "℃"],
        ["", "二段抽汽焓值", "kJ/kg"],
    ];
    let to1;
    let idx
    if (加热器顺序 === "1") { // 正常顺序，即从高压到低压一次编号为1、2、3...
        idx = 2;
        to1 = 1;

    } else { // 如果是加热器顺序是逆序的
        if (lodash.isEqual(高加级数, [1, 2, 3])) { // 如果高加是1、2、3号高加，则逆序排列时，2抽仍然进的是2号高加
            idx = 2;
            to1 = 3;
        } else if (lodash.isEqual(高加级数, [1, 2])) {
            idx = 1;
            to1 = null; // 这种情况下，2号高加是最高一级的加热器，没有加热器疏水会进入该级
        }
    }
    let to = `heater_${idx}_vapor_in`;
    let data2 = [
        ["", idx + "号高加进汽压力", "MPa"],
        ["", idx + "号高加进汽温度", "℃"],
        ["", idx + "号高加进汽焓值", "kJ/kg"],
        ["", idx + "号高加进水压力", "MPa"],
        ["", idx + "号高加进水温度", "℃"],
        ["", idx + "号高加进水焓值", "kJ/kg"],
        ["", idx + "号高加出水压力", "MPa"],
        ["", idx + "号高加出水温度", "℃"],
        ["", idx + "号高加出水焓值", "kJ/kg"],
        ["", idx + "号高加疏水温度", "℃"],
        ["", idx + "号高加疏水焓值", "kJ/kg"],
        ["", "二段抽汽流量", "t/h"],
        ["", idx + "号高加进汽流量", "t/h"],
        ["", idx + "号高加疏水流量", "t/h"],
        ["", "流经" + idx + "号高加给水流量", "t/h"],
        ["", "二段抽汽压损", "%"],
        ["", "上端差", "℃"],
        ["", "下端差", "℃"],
        ["", idx + "号高加温升", "℃"],
        ["", "二段抽汽能量", "MJ/h"],
    ];
    wps.PluginStorage.setItem("extract2_info", JSON.stringify({"row": row, "idx": idx}))
    data.push(...data2); // 拼接data和data2两个数组，es6语法
    set_cells(row + 2, 1, data);
    set_cell_color(row + 2, 1, 4); // 设置第一个单元格背景色
    app.Goto(app.ActiveSheet.Cells.Item(row + 2, 1), true); //滚动窗口到更改内容
    let leakage = sp.leakage.obj;
    let source = leakage.get_source("高排");
    for (let i = 4; i <= wps.PluginStorage.getItem("sheet_columns"); i++) { // 默认漏汽至高排测点之前，二抽=高排+漏汽混合后参数，则二抽参数=漏汽混合后的蒸汽参数
        fill_cell(row + 2, i, "para", "extract_2.P") // 混合压力=抽汽压力
        fill_cell(row + 3, i, "para", "extract_2.T") //
        fill_cell(row + 4, i, "formula", `{extract_2.H}=H_PT({row-2},{row-1})`) //
        // ------------------------------- 高加进汽 ---------------------------------
        fill_cell(row + 5, i, "para", `heater_${idx}_vapor_in.P`)
        fill_cell(row + 6, i, "para", `heater_${idx}_vapor_in.T`)
        fill_cell(row + 7, i, "formula", `{heater_${idx}_vapor_in.H}=H_PT({row-2},{row-1})`)
        // =============================== 高加进汽 ====================================
        // ----------------------------高加进水-----------------------------------
        let point_id = `heater_${idx}_water_in`;  // 高加进水测点名
        let water_in_P = Enum.StandardPoint[point_id]["href"]["P"];
        if (water_in_P) {
            // 如果存在相应高加的进水压力，就使用
            fill_cell(row + 8, i, "para", point_id + ".P");
        } else {
            let form = "{" + point_id + ".P}={final_feed_water.P}+2*({feed_pump_out.P}-{final_feed_water.P})/" + 高加级数.length;
            fill_cell(row + 8, i, "formula", form)
        }
        // ============================高加进水压力=====================================
        // ---------------------------------高加进水焓值------------------------------------
        try {
            fill_cell(row + 9, i, "para", "heater_" + idx + "_water_in.T");
        } catch (e) {
            console.log(e);
            alert("未找到" + idx + "号高加进水温度，请检查！");
        }
        fill_cell(row + 10, i, "formula", "{heater_" + idx + "_water_in.H}=H_PT({row-2},{row-1})");
        // ================================ 高加进水焓值 =====================================
        // ------------------------------------ 高加出水 -----------------------------------------
        fill_cell(row + 11, i, "para", "heater_" + idx + "_water_out.P")
        fill_cell(row + 12, i, "para", "heater_" + idx + "_water_out.T")
        fill_cell(row + 13, i, "formula", "{heater_" + idx + "_water_out.H}=H_PT({row-2},{row-1})")
        // =============================== 高加出水 =================================
        // -------------------------------- 疏水 -------------------------------------
        fill_cell(row + 14, i, "para", "heater_" + idx + "_vapor_out.T")
        fill_cell(row + 15, i, "formula", "{heater_" + idx + "_vapor_out.H}=HW_T({row-1})")
        // ============================疏水=====================================
        let form;
        if (to1) {
            let 上级疏水放热量 = "{heater_" + to1 + "_vapor_out.F}*({heater_" + to1 + "_vapor_out.H}-{row-2})";
            form = `{heater_${idx}_vapor_in.F}=({row+2}*({row-4}-{row-7})-${上级疏水放热量})/({row-10}-{row-2})`
        } else {
            form = `{heater_${idx}_vapor_in.F}={row+2}*({row-4}-{row-7})/({row-10}-{row-2})`
        }

        // 如果有漏气至高排，则实际高排流量需要减去漏气流量，但此路一般为夹层漏汽，计算中认为该漏汽为汽机本体特性，不予考虑
        fill_cell(row + 16, i, "formula", "{extract_2.F}={row+1}")
        fill_cell(row + 17, i, "formula", form); // 2号高加进汽流量
        // 默认当前级的疏水=当前级的抽汽流量+上一级的疏水流量
        if (to1) {
            fill_cell(row + 18, i, "formula",
                "{heater_" + idx + "_vapor_out.F}={row-1}+{heater_" + to1 + "_vapor_out.F}") //2号高加疏水流量
        } else {
            fill_cell(row + 18, i, "formula",
                "{heater_" + idx + "_vapor_out.F}={row-1}") //2号高加疏水流量
        }

        fill_cell(row + 19, i, "formula", "{heater_" + idx + ".F}}={final_feed_water.F}") // 流经2号高加的给水流量
        set_position_of_para("heater_" + idx + "_water_out.F", app.ActiveSheet.Name + "!{Y}" + row + 19) // 流经二号高加的给水流量=二号高加出口给水流量
        fill_cell(row + 20, i, "formula", "{extract_2.压损}=({row-18}-{row-15})/{row-18}*100") // 二抽压损
        fill_cell(row + 21, i, "formula", "{heater_" + idx + ".上端差}=T_P({row-16})-{row-9}")
        fill_cell(row + 22, i, "formula", "{heater_" + idx + ".下端差}={row-8}-{row-13}")
        fill_cell(row + 23, i, "formula", "{heater_" + idx + ".温升}={row-11}-{row-14}")
        fill_cell(row + 24, i, "formula", "{extract_2.E}={extract_2.F}*{extract_2.H}")
    }

    // 添加漏气至二抽测点位置下拉选项
    // if (source) {
    //     let cell = get_cell_value(row + 16, 1, undefined, true)
    //     let current_selected_value = "漏汽至高排测点之前"
    //     cell.Validation.Add(3, null, null, "漏汽至高排测点之前,漏汽至高排测点之后,忽略夹层漏汽", 1)
    //     cell.Value2 = current_selected_value
    //     cell.Validation.InputMessage = JSON.stringify({"value": current_selected_value, "id": 1}) // 当下拉列表中的值改变时，这里的value记录改变前的值
    //     cell.Validation.ShowInput = false; // 隐藏掉InputMessage的显示，因为Formula2是只读的，这里使用InputMessage保存单元格的额外信息，不像用户显示该信息
    //     set_cell_color(row + 16, 1, 6)
    // }
}

export function modifyExtract2(cell) {
    /**
     * 更改二抽中关于漏汽的计算细节，只有存在漏至二抽的蒸汽时，才会出现执行到该函数的下拉列表，也才会执行到该函数。
     *
     * @type {string}
     */
    // let new_value = cell.Value2.toString();
    // let info = JSON.parse(wps.PluginStorage.getItem("extract2_info"))
    // let row = info.row;
    // let idx = info.idx
    // let sp = Enum.StandardPoint;
    // let leakage = sp.leakage.obj;
    // let source = leakage.get_source("高排"); // 漏至高排的抽汽的来源，一般为高压前轴封一漏
    // let leakage_F = `{leakage.${source}流量}`;
    // if (new_value === "漏汽至高排测点之前") {
    //     for (let ii = 4; ii <= wps.PluginStorage.getItem("sheet_columns"); ii++) {
    //         fill_cell(row + 2, ii, "para", "extract_2.P") // 测量的实际是混合压力，但混合压力=抽汽压力
    //         sp.set_para_link("extract_2.P_mixed", sp.get_para_link("extract_2.P")) //  将测点中的抽汽压力赋值给混合压力
    //         sp.set_para_link("extract_2.T_mixed", sp.get_para_link("extract_2.T")) //  将测点中的抽汽温度赋值给混合温度
    //         sp.delete_para("extract_2.T") // 删除掉当前的二抽压力引用
    //         fill_cell(row + 3, ii, "formula", "{extract_2.T}=T_PH({row-1},{row+1})") // 测量的实际是混合温度，T = T_PH(row-1,H)
    //         fill_cell(row + 4, ii, "formula", `{extract_2.H}=(H_PT({extract_2.P_mixed},{extract_2.T_mixed})*{row+13}-{${leakage_F}}*{main_steam.H})/({row+13}-{${leakage_F}})`) // 抽汽焓=(混合蒸汽焓*混合蒸汽流量-漏汽焓*漏汽流量)/抽汽流量
    //         // ------------------------------- 高加进汽 ---------------------------------
    //         // 如果高加进汽存在，则直接使用高加进汽试验测量参数，否则使用混合前参数计算混合后参数
    //         if (sp[`heater_${idx}_vapor_in`].href["P"]) {
    //             fill_cell(row + 5, ii, "para", `heater_${idx}_vapor_in.P`);
    //             fill_cell(row + 6, ii, "para", `heater_${idx}_vapor_in.T`)
    //         } else {
    //             fill_cell(row + 5, ii, "formula", `{heater_${idx}_vapor_in.P}={extract_2.P}`); // 两股不同的蒸汽混合时，混合前后的蒸汽压力是相同的
    //             fill_cell(row + 6, ii, "para", `{heater_${idx}_vapor_in.T}=T_PH({row-1},)`) // 进汽温度根据T_PH(row-1, 混合后蒸汽焓)确定
    //         }
    //         // =============================== 高加进汽 ====================================
    //         fill_cell(row + 16, ii, "formula", `{extract_2.F}={row+1}-{${leakage_F}}`) // 二抽=二进-漏汽流量
    //     }
    //
    // } else if (new_value === "漏汽至高排测点之后") {
    //     // 一般不会出现这种情况，参加下一个else模块中的注释。如果出现这种情况，则
    //     // 测量点的二抽压力、温度实际为二抽与漏汽混合后的压力和温度
    //     for (let ii = 4; ii <= wps.PluginStorage.getItem("sheet_columns"); ii++) {
    //         fill_cell(row + 2, ii, "para", "extract_2.P") // 抽汽压力
    //         fill_cell(row + 3, ii, "para", "extract_2.T") // 抽汽温度
    //         // ------------------------------- 高加进汽 ---------------------------------
    //         // 如果高加进汽存在，则直接使用高加进汽试验测量参数，否则使用混合前参数计算混合后参数
    //         if (sp.heater_2_vapor_in.href["P"]) {
    //             fill_cell(row + 5, ii, "para", `heater_${idx}_vapor_in.P`);
    //             fill_cell(row + 6, ii, "para", `heater_${idx}_vapor_in.T`)
    //         } else {
    //             fill_cell(row + 5, ii, "formula", `{heater_${idx}_vapor_in.P}={extract_2.P}`); // 两股不同的蒸汽混合时，混合前后的蒸汽压力是相同的
    //             fill_cell(row + 6, ii, "para", `{heater_${idx}_vapor_in.T}=T_PH({row-1},)`) // 进汽温度根据T_PH(row-1, 混合后蒸汽焓)确定
    //         }
    //         // =============================== 高加进汽 ====================================
    //         fill_cell(row + 16, ii, "formula", `{extract_2.F}={row+1}-${leakage_F}`) // 二抽=二进-漏汽流量
    //     }
    // } else if (new_value === "忽略夹层漏汽") {
    //     // 一般来说，漏至二抽的漏汽来自高压缸前轴封一漏或夹层漏汽，但这部分漏汽从高压缸前轴封经夹层漏至高压缸排汽中，汽缸外部看不到测点。
    //     // 通常情况下，汽机厂家给出的高压缸效率是考虑了这部分漏汽之后的效率，性能试验时可以认为这部分漏汽属于汽缸本身的特性，因此可以忽略
    //     // 该股漏汽。直接用主汽和漏汽后的高排测点计算高压缸效率作为试验值与性能保证值进行对比。
    //     for (let ii = 4; ii <= wps.PluginStorage.getItem("sheet_columns"); ii++) {
    //         fill_cell(row + 2, ii, "para", "extract_2.P") //
    //         fill_cell(row + 3, ii, "para", "extract_2.T")
    //         fill_cell(row + 4, ii, "formula", "{extract_2.H}=H_PT({row-2}, {row-1})")
    //         fill_cell(row + 16, ii, "formula", "{extract_2.F}={row+1}") // 认为二抽=二进
    //     }
    // }
}